const express = require('express');
const history = require('connect-history-api-fallback');
const multer = require('multer');
const moment = require('moment');
const body = require('body-parser');
const db = require('./libs/DAO');
const createId = require('./libs/createId')

const server = express();
const router = express.Router()
let time = moment().format('YYYY-MM-DD');
let upload = multer({ dest: __dirname + '/upload/' + time });
server.use(async (req, res, next) => {
    req.db = db;
//     // 允许来自所有域名请求
//     res.setHeader("Access-Control-Allow-Origin", "http://localhost:8080");
// // 这样就能只允许 http://localhost:8080 这个域名的请求了
// // res.setHeader("Access-Control-Allow-Origin", "http://localhost:8080");
//
// // 设置所允许的HTTP请求方法
//     res.setHeader("Access-Control-Allow-Methods", "OPTIONS, GET, PUT, POST, DELETE");
//
// // 字段是必需的。它也是一个逗号分隔的字符串，表明服务器支持的所有头信息字段.
//     res.setHeader("Access-Control-Allow-Headers", "x-requested-with, accept, origin, content-type");
//
// // 服务器收到请求以后，检查了Origin、Access-Control-Request-Method和Access-Control-Request-Headers字段以后，确认允许跨源请求，就可以做出回应。
//
// // Content-Type表示具体请求中的媒体类型信息
//     res.setHeader("Content-Type", "application/json;charset=utf-8");
//
// // 该字段可选。它的值是一个布尔值，表示是否允许发送Cookie。默认情况下，Cookie不包括在CORS请求之中。
// // 当设置成允许请求携带cookie时，需要保证"Access-Control-Allow-Origin"是服务器有的域名，而不能是"*";
//     res.setHeader("Access-Control-Allow-Credentials", true);
//
// // 该字段可选，用来指定本次预检请求的有效期，单位为秒。
// // 当请求方法是PUT或DELETE等特殊方法或者Content-Type字段的类型是application/json时，服务器会提前发送一次请求进行验证
// // 下面的的设置只本次验证的有效时间，即在该时间段内服务端可以不用进行验证
//     res.setHeader("Access-Control-Max-Age", 300);
//
//     /*
//     CORS请求时，XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段：
//         Cache-Control、
//         Content-Language、
//         Content-Type、
//         Expires、
//         Last-Modified、
//         Pragma。
//     */
// // 需要获取其他字段时，使用Access-Control-Expose-Headers，
// // getResponseHeader('myData')可以返回我们所需的值
// //https://www.rails365.net/articles/cors-jin-jie-expose-headers-wu
//     res.setHeader("Access-Control-Expose-Headers", "myData");
//
    next();
});
server.use(history());
server.use(express.static(__dirname + '/client'));
server.use(body.urlencoded());
server.use(body.json());

router.post('/api/upload', upload.array('file', 12),async (req, res) => {
    console.log(req.body, req.files);
    let files = req.files;
    let data = []
    for (let i = 0; i < files.length; i++) {
        let targetPath = files[i].path.split('\\').slice(2).join('/')
        console.log(files[i])
        let extname = path.extname(files[i].originalname).substr(1);
        let name = files[i].originalname
        let type = files[i].mimetype
        let temp = {path: targetPath, type, name, extname};
        let res = await req.db.query(`insert into vue_demo_component (path, name, extname, type) values (?,?,?,?); `, [targetPath, name, extname, type]);
        console.log(res)
        data.push(temp)
    }
    res.send({status: 1, data})
});

router.post('/api/soundCode', async (req, res) => {
    let id = createId();
    let {code, codeTag} = req.body;
    let flag = await detectionTag(req, codeTag);
    if (!flag) res.send(200, {status: 0, code: 'tag已存在'});
    try {
        dbRes = await req.db.query(`insert into sound_code (id, code, code_tag) values (?,?,?);`, [id, code, codeTag])
    } catch(e) {
        console.log(e);
        res.send(500, {status: 0, code: e.code});
    }
    res.send(200, {status: 1, code: '发送成功'});
});

router.get('/api/soundCodeShow/:tag', async (req, res) => {
    let {tag} = req.params;
    console.log(tag)
    let dbRes;
    try {
        dbRes = await req.db.query(`select * from sound_code where (code_tag=?);`, [tag]);
    } catch(e) {
        console.log(e)
        res.send(500, {status: 0, code: e.code});
    }
    res.send(200, {status: 1, data:dbRes[0]});
});

async function  detectionTag (req, codeTag) {
    let tags = await req.db.query(`select code_tag from sound_code;`);
    console.log(tags);
    for (let i = 0; i < tags.length; i++) {
        if (tags[i]['code_tag'] === codeTag) return false
    }
    return true
}
server.use(router);
server.listen('1234');